var BMapLib = window.BMapLib = BMapLib || {};
var INFOBOX_AT_TOP = 1,
	INFOBOX_AT_RIGHT = 2,
	INFOBOX_AT_BOTTOM = 3,
	INFOBOX_AT_LEFT = 4;
(function() {
	var b, a = b = a || {
		version: "1.5.0"
	};
	a.guid = "$BAIDU$";
	(function() {
		window[a.guid] = window[a.guid] || {};
		a.lang = a.lang || {};
		a.lang.isString = function(d) {
			return "[object String]" == Object.prototype.toString.call(d)
		};
		a.lang.isFunction = function(d) {
			return "[object Function]" == Object.prototype.toString.call(d)
		};
		a.lang.Event = function(d, e) {
			this.type = d;
			this.returnValue = true;
			this.target = e || null;
			this.currentTarget = null
		};
		a.object = a.object || {};
		a.extend = a.object.extend = function(f, d) {
			for (var e in d) {
				if (d.hasOwnProperty(e)) {
					f[e] = d[e]
				}
			}
			return f
		};
		a.event = a.event || {};
		a.event._listeners = a.event._listeners || [];
		a.dom = a.dom || {};
		a.dom._g = function(d) {
			if (a.lang.isString(d)) {
				return document.getElementById(d)
			}
			return d
		};
		a._g = a.dom._g;
		a.event.on = function(e, h, j) {
			h = h.replace(/^on/i, "");
			e = a.dom._g(e);
			var i = function(l) {
					j.call(e, l)
				},
				d = a.event._listeners,
				g = a.event._eventFilter,
				k, f = h;
			h = h.toLowerCase();
			if (g && g[h]) {
				k = g[h](e, h, i);
				f = k.type;
				i = k.listener
			}
			if (e.addEventListener) {
				e.addEventListener(f, i, false)
			} else {
				if (e.attachEvent) {
					e.attachEvent("on" + f, i)
				}
			}
			d[d.length] = [e, h, j, i, f];
			return e
		};
		a.on = a.event.on;
		a.event.un = function(f, i, e) {
			f = a.dom._g(f);
			i = i.replace(/^on/i, "").toLowerCase();
			var l = a.event._listeners,
				g = l.length,
				h = !e,
				k, j, d;
			while (g--) {
				k = l[g];
				if (k[1] === i && k[0] === f && (h || k[2] === e)) {
					j = k[4];
					d = k[3];
					if (f.removeEventListener) {
						f.removeEventListener(j, d, false)
					} else {
						if (f.detachEvent) {
							f.detachEvent("on" + j, d)
						}
					}
					l.splice(g, 1)
				}
			}
			return f
		};
		a.un = a.event.un;
		a.dom.g = function(d) {
			if ("string" == typeof d || d instanceof String) {
				return document.getElementById(d)
			} else {
				if (d && d.nodeName && (d.nodeType == 1 || d.nodeType == 9)) {
					return d
				}
			}
			return null
		};
		a.g = a.G = a.dom.g;
		a.dom._styleFixer = a.dom._styleFixer || {};
		a.dom._styleFilter = a.dom._styleFilter || [];
		a.dom._styleFilter.filter = function(e, h, j) {
			for (var d = 0, g = a.dom._styleFilter, f; f = g[d]; d++) {
				if (f = f[j]) {
					h = f(e, h)
				}
			}
			return h
		};
		a.string = a.string || {};
		a.string.toCamelCase = function(d) {
			if (d.indexOf("-") < 0 && d.indexOf("_") < 0) {
				return d
			}
			return d.replace(/[-_][^-_]/g, function(e) {
				return e.charAt(1).toUpperCase()
			})
		};
		a.dom.setStyle = function(f, e, g) {
			var h = a.dom,
				d;
			f = h.g(f);
			e = a.string.toCamelCase(e);
			if (d = h._styleFilter) {
				g = d.filter(e, g, "set")
			}
			d = h._styleFixer[e];
			(d && d.set) ? d.set(f, g): (f.style[d || e] = g);
			return f
		};
		a.setStyle = a.dom.setStyle;
		a.dom.setStyles = function(e, f) {
			e = a.dom.g(e);
			for (var d in f) {
				a.dom.setStyle(e, d, f[d])
			}
			return e
		};
		a.setStyles = a.dom.setStyles;
		a.browser = a.browser || {};
		a.browser.ie = a.ie = /msie (\d+\.\d+)/i.test(navigator.userAgent) ? (document.documentMode || +RegExp["\x241"]) : undefined;
		a.dom._NAME_ATTRS = (function() {
			var d = {
				cellpadding: "cellPadding",
				cellspacing: "cellSpacing",
				colspan: "colSpan",
				rowspan: "rowSpan",
				valign: "vAlign",
				usemap: "useMap",
				frameborder: "frameBorder"
			};
			if (a.browser.ie < 8) {
				d["for"] = "htmlFor";
				d["class"] = "className"
			} else {
				d.htmlFor = "for";
				d.className = "class"
			}
			return d
		})();
		a.dom.setAttr = function(e, d, f) {
			e = a.dom.g(e);
			if ("style" == d) {
				e.style.cssText = f
			} else {
				d = a.dom._NAME_ATTRS[d] || d;
				e.setAttribute(d, f)
			}
			return e
		};
		a.setAttr = a.dom.setAttr;
		a.dom.setAttrs = function(f, d) {
			f = a.dom.g(f);
			for (var e in d) {
				a.dom.setAttr(f, e, d[e])
			}
			return f
		};
		a.setAttrs = a.dom.setAttrs;
		a.dom.create = function(f, d) {
			var g = document.createElement(f),
				e = d || {};
			return a.dom.setAttrs(g, e)
		};
		b.undope = true
	})();
	var c = BMapLib.InfoBox = function(f, e, d) {
		this._content = e || "";
		this._isOpen = false;
		this._map = f;
		this._opts = d = d || {};
		this._opts.offset = d.offset || new BMap.Size(0, 0);
		this._opts.boxClass = d.boxClass || "infoBox";
		this._opts.boxStyle = d.boxStyle || {};
		this._opts.closeIconMargin = d.closeIconMargin || "2px";
		this._opts.closeIconUrl = d.closeIconUrl || "close.png";
		this._opts.enableAutoPan = d.enableAutoPan ? true : false;
		this._opts.align = d.align || INFOBOX_AT_TOP
	};
	c.prototype = new BMap.Overlay();
	c.prototype.initialize = function(e) {
		var d = this;
		var g = this._div = a.dom.create("div", {
			"class": this._opts.boxClass
		});
		a.dom.setStyles(g, this._opts.boxStyle);
		g.style.position = "absolute";
		this._setContent(this._content);
		var f = e.getPanes().floatPane;
		f.style.width = "auto";
		f.appendChild(g);
		this._getInfoBoxSize();
		a.event.on(g, "onmousedown", function(h) {
			d._stopBubble(h)
		});
		a.event.on(g, "onmouseover", function(h) {
			d._stopBubble(h)
		});
		a.event.on(g, "click", function(h) {
			d._stopBubble(h)
		});
		a.event.on(g, "dblclick", function(h) {
			d._stopBubble(h)
		});
		return g
	};
	c.prototype.draw = function() {
		this._isOpen && this._adjustPosition(this._point)
	};
	c.prototype.open = function(d) {
		var e = this,
			f;
		if (!this._isOpen) {
			this._map.addOverlay(this);
			this._isOpen = true;
			setTimeout(function() {
				e._dispatchEvent(e, "open", {
					point: e._point
				})
			}, 10)
		}
		if (d instanceof BMap.Point) {
			f = d;
			this._removeMarkerEvt()
		} else {
			if (d instanceof BMap.Marker) {
				if (this._marker) {
					this._removeMarkerEvt()
				}
				f = d.getPosition();
				this._marker = d;
				!this._markerDragend && this._marker.addEventListener("dragend", this._markerDragend = function(g) {
					e._point = g.point;
					e._adjustPosition(e._point);
					e._panBox();
					e.show()
				});
				!this._markerDragging && this._marker.addEventListener("dragging", this._markerDragging = function() {
					e.hide();
					e._point = e._marker.getPosition();
					e._adjustPosition(e._point)
				})
			}
		}
		this.show();
		this._point = f;
		this._panBox();
		this._adjustPosition(this._point)
	};
	c.prototype.close = function() {
		if (this._isOpen) {
			this._map.removeOverlay(this);
			this._remove();
			this._isOpen = false;
			this._dispatchEvent(this, "close", {
				point: this._point
			})
		}
	};
	c.prototype.enableAutoPan = function() {
		this._opts.enableAutoPan = true
	};
	c.prototype.disableAutoPan = function() {
		this._opts.enableAutoPan = false
	};
	c.prototype.setContent = function(d) {
		this._setContent(d);
		this._getInfoBoxSize();
		this._adjustPosition(this._point)
	};
	c.prototype.setPosition = function(d) {
		this._point = d;
		this._adjustPosition(d);
		this._removeMarkerEvt()
	};
	c.prototype.getPosition = function() {
		return this._point
	};
	c.prototype.getOffset = function() {
		return this._opts.offset
	}, c.prototype._remove = function() {
		var d = this;
		if (this.domElement && this.domElement.parentNode) {
			a.event.un(this._div.firstChild, "click", d._closeHandler());
			this.domElement.parentNode.removeChild(this.domElement)
		}
		this.domElement = null;
		this._isOpen = false;
		this.dispatchEvent("onremove")
	}, a.object.extend(c.prototype, {
		_getCloseIcon: function() {
			var d = "<img src='" + this._opts.closeIconUrl + "' align='right' style='position:absolute;right:0px;cursor:pointer;margin:" + this._opts.closeIconMargin + "'/>";
			return d
		},
		_setContent: function(e) {
			if (!this._div) {
				return
			}
			var d = this._getCloseIcon();
			if (typeof e.nodeType === "undefined") {
				this._div.innerHTML = d + e
			} else {
				this._div.innerHTML = d;
				this._div.appendChild(e)
			}
			this._content = e;
			this._addEventToClose()
		},
		_adjustPosition: function(f) {
			var d = this._getPointPosition(f);
			var e = this._marker && this._marker.getIcon();
			switch (this._opts.align) {
				case INFOBOX_AT_TOP:
					if (this._marker) {
						this._div.style.bottom = -(d.y - this._opts.offset.height - e.anchor.height + e.infoWindowAnchor.height) - this._marker.getOffset().height + 2 + "px"
					} else {
						this._div.style.bottom = -(d.y - this._opts.offset.height) + "px"
					}
					break;
				case INFOBOX_AT_BOTTOM:
					if (this._marker) {
						this._div.style.top = d.y + this._opts.offset.height - e.anchor.height + e.infoWindowAnchor.height + this._marker.getOffset().height + "px"
					} else {
						this._div.style.top = d.y + this._opts.offset.height + "px"
					}
					break
			}
			if (this._marker) {
				this._div.style.left = d.x - e.anchor.width + this._marker.getOffset().width + e.infoWindowAnchor.width - this._boxWidth / 2 + "px"
			} else {
				this._div.style.left = d.x - this._boxWidth / 2 + "px"
			}
		},
		_getPointPosition: function(d) {
			this._pointPosition = this._map.pointToOverlayPixel(d);
			return this._pointPosition
		},
		_getInfoBoxSize: function() {
			this._boxWidth = parseInt(this._div.offsetWidth, 10);
			this._boxHeight = parseInt(this._div.offsetHeight, 10)
		},
		_addEventToClose: function() {
			var d = this;
			a.event.on(this._div.firstChild, "click", d._closeHandler());
			this._hasBindEventClose = true
		},
		_closeHandler: function() {
			var d = this;
			return function(f) {
				d.close()
			}
		},
		_stopBubble: function(d) {
			if (d && d.stopPropagation) {
				d.stopPropagation()
			} else {
				window.event.cancelBubble = true
			}
		},
		_panBox: function() {
			if (!this._opts.enableAutoPan) {
				return
			}
			var i = parseInt(this._map.getContainer().offsetHeight, 10),
				o = parseInt(this._map.getContainer().offsetWidth, 10),
				j = this._boxHeight,
				d = this._boxWidth;
			if (j >= i || d >= o) {
				return
			}
			if (!this._map.getBounds().containsPoint(this._point)) {
				this._map.setCenter(this._point)
			}
			var e = this._map.pointToPixel(this._point),
				p, m, l, g = d / 2 - e.x,
				n = d / 2 + e.x - o;
			if (this._marker) {
				var k = this._marker.getIcon()
			}
			switch (this._opts.align) {
				case INFOBOX_AT_TOP:
					var f = this._marker ? k.anchor.height + this._marker.getOffset().height - k.infoWindowAnchor.height : 0;
					p = j - e.y + this._opts.offset.height + f + 2;
					break;
				case INFOBOX_AT_BOTTOM:
					var f = this._marker ? -k.anchor.height + k.infoWindowAnchor.height + this._marker.getOffset().height + this._opts.offset.height : 0;
					m = j + e.y - i + f + 4;
					break
			}
			panX = g > 0 ? g : (n > 0 ? -n : 0);
			l = p > 0 ? p : (m > 0 ? -m : 0);
			this._map.panBy(panX, l)
		},
		_removeMarkerEvt: function() {
			this._markerDragend && this._marker.removeEventListener("dragend", this._markerDragend);
			this._markerDragging && this._marker.removeEventListener("dragging", this._markerDragging);
			this._markerDragend = this._markerDragging = null
		},
		_dispatchEvent: function(d, e, g) {
			e.indexOf("on") != 0 && (e = "on" + e);
			var f = new a.lang.Event(e);
			if (!!g) {
				for (var h in g) {
					f[h] = g[h]
				}
			}
			d.dispatchEvent(f)
		}
	})
})();